﻿#ifndef GAMEMANAGER_H
#define GAMEMANAGER_H

#include "gamesce.h"
#include "card.h"

#include <QObject>
#include <QList>
#include <QMediaPlayer>

struct Card_Info{
    Card::Group group; // 卡牌阵营
    Card::Monster_Type type; // 卡牌物种
    bool isBack; // 卡牌是否在背面
    bool isWall = false; // 卡牌是否处于墙态
};

struct pos{
    int row;
    int col;
};

class GameManager : public QObject
{
    Q_OBJECT
public:
    explicit GameManager(GameSce* scene, QList<Card*>* list, QObject *parent = nullptr);
    virtual ~GameManager();

private:
    void HumanDo(bool humanGroup, int Rotation, Card* card); // 处理玩家操作信息
    void AiDo(); // 处理电脑操作信息
    int algorithm_akgry_escape(int rotation, int row, int col); // 电脑逃脱算法
    void algorithm_akgry_do(int para, int row, int col); // 电脑根据参数下棋
    void algorithm_akgry_main(); // 电脑主算法，由程序员Akgry提供，偏笨，可通过修改'核心'进行优化
    void algorithm_akgry_strategy(bool); // 电脑战略算法(核心)
    void gameOver(Card::Group loser); // 游戏结束
    void algorithm_akgry_maxValue(int& maxValue, int&maxRotation ,pos& maxPos); //电脑估值算法
    void refuse(); // 废除玩家操作的权力
    void recover(); // 恢复玩家操作的权力

protected:
    virtual void init();
    virtual void Do(bool humanGroup, int Rotation, Card* card); // 处理信息

signals:
    void signal_humanOver(Card::Group);
    void signal_aiOver(Card::Group);

public slots:

protected:
    GameSce* m_sceneGame; // 当前的游戏场景
    QList<Card*>* m_listCard; // 当前卡牌链表
    Card::Group m_HumanGroup; // 玩家使用的卡牌颜色
    Card::Group m_AiGroup; // 电脑使用的卡牌颜色
    Card_Info cards_info[4][4]; // 卡牌事件

    int m_step; // 当前是第几步棋

    QMediaPlayer* m_doPlay;
    QMediaPlayer* m_overPlay;


};



#endif // GAMEMANAGER_H
